{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "DATA_PATH = \"./ppd_data/\"\n",
    "TRAIN_PATH = DATA_PATH + \"train.csv\"\n",
    "TEST_PATH = DATA_PATH + \"test.csv\"\n",
    "WORD_EMBED_PATH = DATA_PATH + \"word_embed.txt\"\n",
    "CHAR_EMBED_PATH = DATA_PATH + \"cahr_embed.txt\"\n",
    "QUEST_PATH = DATA_PATH + \"question.csv\""
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>qid</th>\n",
       "      <th>words</th>\n",
       "      <th>chars</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Q000000</td>\n",
       "      <td>W05733 W05284 W09158 W14968 W07863</td>\n",
       "      <td>L1128 L1861 L2218 L1796 L1055 L0847 L2927</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Q000001</td>\n",
       "      <td>W17378 W17534 W03249 W01490 W18802</td>\n",
       "      <td>L2214 L1980 L0156 L1554 L2218 L1861 L3019 L010...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Q000002</td>\n",
       "      <td>W17378 W08158 W20171 W11246 W14759</td>\n",
       "      <td>L2214 L2350 L2568 L1969 L2168 L0694 L3012 L256...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Q000003</td>\n",
       "      <td>W11385 W14103 W02556 W13157 W09749</td>\n",
       "      <td>L0762 L2172 L1971 L2034 L2039 L2271 L1346 L223...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Q000004</td>\n",
       "      <td>W17508 W18238 W02952 W18103</td>\n",
       "      <td>L0018 L2321 L1346 L3019 L0104 L0902 L0354 L0362</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       qid                               words  \\\n",
       "0  Q000000  W05733 W05284 W09158 W14968 W07863   \n",
       "1  Q000001  W17378 W17534 W03249 W01490 W18802   \n",
       "2  Q000002  W17378 W08158 W20171 W11246 W14759   \n",
       "3  Q000003  W11385 W14103 W02556 W13157 W09749   \n",
       "4  Q000004         W17508 W18238 W02952 W18103   \n",
       "\n",
       "                                               chars  \n",
       "0          L1128 L1861 L2218 L1796 L1055 L0847 L2927  \n",
       "1  L2214 L1980 L0156 L1554 L2218 L1861 L3019 L010...  \n",
       "2  L2214 L2350 L2568 L1969 L2168 L0694 L3012 L256...  \n",
       "3  L0762 L2172 L1971 L2034 L2039 L2271 L1346 L223...  \n",
       "4    L0018 L2321 L1346 L3019 L0104 L0902 L0354 L0362  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "questions = pd.read_csv(QUEST_PATH)\n",
    "questions.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>label</th>\n",
       "      <th>q1</th>\n",
       "      <th>q2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>Q397345</td>\n",
       "      <td>Q538594</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>Q193805</td>\n",
       "      <td>Q699273</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>Q085471</td>\n",
       "      <td>Q676160</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>Q189314</td>\n",
       "      <td>Q438123</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>Q267714</td>\n",
       "      <td>Q290126</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   label       q1       q2\n",
       "0      1  Q397345  Q538594\n",
       "1      0  Q193805  Q699273\n",
       "2      0  Q085471  Q676160\n",
       "3      0  Q189314  Q438123\n",
       "4      0  Q267714  Q290126"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_data = pd.read_csv(TRAIN_PATH)\n",
    "train_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>q1</th>\n",
       "      <th>q2</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Q017571</td>\n",
       "      <td>Q006012</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Q728241</td>\n",
       "      <td>Q542572</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Q166997</td>\n",
       "      <td>Q118270</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Q422420</td>\n",
       "      <td>Q514386</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Q354329</td>\n",
       "      <td>Q032485</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        q1       q2\n",
       "0  Q017571  Q006012\n",
       "1  Q728241  Q542572\n",
       "2  Q166997  Q118270\n",
       "3  Q422420  Q514386\n",
       "4  Q354329  Q032485"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_data = pd.read_csv(TEST_PATH)\n",
    "test_data.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Analyse\n",
    "\n",
    "the basic information of both train data and test data.\n",
    "\n",
    "conclusion:\n",
    "\n",
    "1. data is balanced"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "number of train question pairs: 254386\n",
      "number of train unique first question: 112296, with rate: 0.4414393873876707\n",
      "number of train unique second question: 112404, with rate: 0.4418639390532498\n",
      "total number of train question: 192633\n",
      "positive pair number: 132054, negative pair number: 122332, positive rate: 0.519\n"
     ]
    }
   ],
   "source": [
    "print(\"number of train question pairs:\", len(train_data))\n",
    "print(\"number of train unique first question: %s, with rate: %s\" % \n",
    "      (len(train_data[\"q1\"].unique()), len(train_data[\"q1\"].unique()) / len(train_data)))\n",
    "print(\"number of train unique second question: %s, with rate: %s\" % \n",
    "      (len(train_data[\"q2\"].unique()), len(train_data[\"q2\"].unique()) / len(train_data)))\n",
    "\n",
    "train_unique_q = np.concatenate([train_data[\"q2\"].unique(), train_data[\"q1\"].unique()])\n",
    "train_unique_q = np.unique(train_unique_q)\n",
    "print(\"total number of train question:\", len(train_unique_q))\n",
    "\n",
    "pos_mask = train_data[\"label\"] == 1\n",
    "neg_mask = train_data[\"label\"] == 0\n",
    "print(\"positive pair number: %s, negative pair number: %s, positive rate: %.3f\" %\n",
    "      (pos_mask.sum(), neg_mask.sum(), pos_mask.sum() / len(train_data)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "number of test question pairs: 172956\n",
      "number of test unique first question: 131768, with rate: 0.7618585073660353\n",
      "number of test unique second question: 131496, with rate: 0.7602858530493305\n",
      "total number of test question: 248773\n"
     ]
    }
   ],
   "source": [
    "print(\"number of test question pairs:\", len(test_data))\n",
    "print(\"number of test unique first question: %s, with rate: %s\" % \n",
    "      (len(test_data[\"q1\"].unique()), len(test_data[\"q1\"].unique()) / len(test_data)))\n",
    "print(\"number of test unique second question: %s, with rate: %s\" % \n",
    "      (len(test_data[\"q2\"].unique()), len(test_data[\"q2\"].unique()) / len(test_data)))\n",
    "\n",
    "test_unique_q = np.concatenate([test_data[\"q2\"].unique(), test_data[\"q1\"].unique()])\n",
    "test_unique_q = np.unique(test_unique_q)\n",
    "print(\"total number of test question:\", len(test_unique_q))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[('Q489328', 112), ('Q119369', 109), ('Q632400', 109), ('Q382228', 108), ('Q081677', 107), ('Q555455', 107), ('Q149996', 105), ('Q436579', 105), ('Q143237', 105), ('Q424359', 104)]\n",
      "[('Q066137', 34), ('Q209532', 31), ('Q526780', 31), ('Q665740', 29), ('Q405292', 28), ('Q092597', 28), ('Q195819', 26), ('Q150486', 26), ('Q263180', 26), ('Q492945', 25)]\n"
     ]
    }
   ],
   "source": [
    "from collections import Counter\n",
    "\n",
    "train_question = np.concatenate([train_data[\"q1\"], train_data[\"q2\"]])\n",
    "test_question = np.concatenate([test_data[\"q1\"], test_data[\"q2\"]])\n",
    "train_counter = Counter(train_question)\n",
    "test_counter = Counter(test_question)\n",
    "print(train_counter.most_common(10))\n",
    "print(test_counter.most_common(10))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "the number of questions in both train and test: 34815\n"
     ]
    }
   ],
   "source": [
    "both = []\n",
    "for q in train_counter:\n",
    "    if q in test_counter:\n",
    "        both.append(q)\n",
    "print(\"the number of questions in both train and test:\", len(both))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**there may be some tricks to improve lb performence with these duplicated question.**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "words = questions[\"words\"].str.split(\" \").tolist()\n",
    "chars = questions[\"chars\"].str.split(\" \").tolist()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from gensim.corpora import Dictionary\n",
    "\n",
    "word_dict = Dictionary(words)\n",
    "char_dict = Dictionary(chars)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "number of words: 20890, number of chars: 3048\n"
     ]
    }
   ],
   "source": [
    "print(\"number of words: %d, number of chars: %d\" % (len(word_dict.dfs), len(char_dict.dfs)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "      <th>prop</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>225209</td>\n",
       "      <td>15.458563</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>27</th>\n",
       "      <td>151787</td>\n",
       "      <td>10.418806</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>147457</td>\n",
       "      <td>10.121591</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>22</th>\n",
       "      <td>127924</td>\n",
       "      <td>8.780827</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>21</th>\n",
       "      <td>112820</td>\n",
       "      <td>7.744074</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>92782</td>\n",
       "      <td>6.368646</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>64</th>\n",
       "      <td>90549</td>\n",
       "      <td>6.215371</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>80819</td>\n",
       "      <td>5.547494</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>74949</td>\n",
       "      <td>5.144572</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>71344</td>\n",
       "      <td>4.897121</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     count       prop\n",
       "7   225209  15.458563\n",
       "27  151787  10.418806\n",
       "36  147457  10.121591\n",
       "22  127924   8.780827\n",
       "21  112820   7.744074\n",
       "1    92782   6.368646\n",
       "64   90549   6.215371\n",
       "2    80819   5.547494\n",
       "5    74949   5.144572\n",
       "0    71344   4.897121"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "word_series = pd.Series(list(word_dict.dfs.values()), index=list(word_dict.dfs.keys()), name=\"count\").sort_values(ascending=False)\n",
    "word_prop = word_series / len(questions) / 2 * 100\n",
    "word_prop.name = \"prop\"\n",
    "word_df = pd.concat([word_series, word_prop], axis=1)\n",
    "word_df.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>count</th>\n",
       "      <th>prop</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>270887</td>\n",
       "      <td>18.593945</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>12</th>\n",
       "      <td>243693</td>\n",
       "      <td>16.727322</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>212914</td>\n",
       "      <td>14.614622</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>56</th>\n",
       "      <td>177513</td>\n",
       "      <td>12.184663</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>13</th>\n",
       "      <td>172025</td>\n",
       "      <td>11.807962</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>36</th>\n",
       "      <td>164027</td>\n",
       "      <td>11.258971</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>5</th>\n",
       "      <td>157696</td>\n",
       "      <td>10.824405</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>42</th>\n",
       "      <td>154583</td>\n",
       "      <td>10.610726</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>130525</td>\n",
       "      <td>8.959362</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>32</th>\n",
       "      <td>112820</td>\n",
       "      <td>7.744074</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     count       prop\n",
       "7   270887  18.593945\n",
       "12  243693  16.727322\n",
       "4   212914  14.614622\n",
       "56  177513  12.184663\n",
       "13  172025  11.807962\n",
       "36  164027  11.258971\n",
       "5   157696  10.824405\n",
       "42  154583  10.610726\n",
       "2   130525   8.959362\n",
       "32  112820   7.744074"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "char_series = pd.Series(list(char_dict.dfs.values()), index=list(char_dict.dfs.keys()), name=\"count\").sort_values(ascending=False)\n",
    "char_prop = char_series / len(questions) / 2 * 100\n",
    "char_prop.name = \"prop\"\n",
    "char_df = pd.concat([char_series, char_prop], axis=1)\n",
    "char_df.head(10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>qid</th>\n",
       "      <th>words</th>\n",
       "      <th>chars</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Q000000</td>\n",
       "      <td>[W05733, W05284, W09158, W14968, W07863]</td>\n",
       "      <td>[L1128, L1861, L2218, L1796, L1055, L0847, L2927]</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Q000001</td>\n",
       "      <td>[W17378, W17534, W03249, W01490, W18802]</td>\n",
       "      <td>[L2214, L1980, L0156, L1554, L2218, L1861, L30...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Q000002</td>\n",
       "      <td>[W17378, W08158, W20171, W11246, W14759]</td>\n",
       "      <td>[L2214, L2350, L2568, L1969, L2168, L0694, L30...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Q000003</td>\n",
       "      <td>[W11385, W14103, W02556, W13157, W09749]</td>\n",
       "      <td>[L0762, L2172, L1971, L2034, L2039, L2271, L13...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Q000004</td>\n",
       "      <td>[W17508, W18238, W02952, W18103]</td>\n",
       "      <td>[L0018, L2321, L1346, L3019, L0104, L0902, L03...</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       qid                                     words  \\\n",
       "0  Q000000  [W05733, W05284, W09158, W14968, W07863]   \n",
       "1  Q000001  [W17378, W17534, W03249, W01490, W18802]   \n",
       "2  Q000002  [W17378, W08158, W20171, W11246, W14759]   \n",
       "3  Q000003  [W11385, W14103, W02556, W13157, W09749]   \n",
       "4  Q000004          [W17508, W18238, W02952, W18103]   \n",
       "\n",
       "                                               chars  \n",
       "0  [L1128, L1861, L2218, L1796, L1055, L0847, L2927]  \n",
       "1  [L2214, L1980, L0156, L1554, L2218, L1861, L30...  \n",
       "2  [L2214, L2350, L2568, L1969, L2168, L0694, L30...  \n",
       "3  [L0762, L2172, L1971, L2034, L2039, L2271, L13...  \n",
       "4  [L0018, L2321, L1346, L3019, L0104, L0902, L03...  "
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "questions[\"words\"] = questions[\"words\"].str.split(\" \")\n",
    "questions[\"chars\"] = questions[\"chars\"].str.split(\" \")\n",
    "questions.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>label</th>\n",
       "      <th>q1</th>\n",
       "      <th>q2</th>\n",
       "      <th>w1</th>\n",
       "      <th>c1</th>\n",
       "      <th>w2</th>\n",
       "      <th>c2</th>\n",
       "      <th>wnum1</th>\n",
       "      <th>cnum1</th>\n",
       "      <th>wnum2</th>\n",
       "      <th>cnum2</th>\n",
       "      <th>wboth</th>\n",
       "      <th>cboth</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>Q397345</td>\n",
       "      <td>Q538594</td>\n",
       "      <td>[W04465, W04058, W05284, W02916]</td>\n",
       "      <td>[L2218, L2568, L0360, L0242, L2218, L0741]</td>\n",
       "      <td>[W18238, W18843, W01490, W09905]</td>\n",
       "      <td>[L3019, L0104, L0582, L2218, L1861, L1556, L0242]</td>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "      <td>4</td>\n",
       "      <td>7</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>Q193805</td>\n",
       "      <td>Q699273</td>\n",
       "      <td>[W10054, W04476, W09996, W12244, W18103]</td>\n",
       "      <td>[L2376, L2168, L0050, L1187, L0104, L2432, L09...</td>\n",
       "      <td>[W18439, W00863, W04259, W00740, W16070]</td>\n",
       "      <td>[L0156, L2452, L1187, L0104, L2459, L2979, L26...</td>\n",
       "      <td>5</td>\n",
       "      <td>10</td>\n",
       "      <td>5</td>\n",
       "      <td>8</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>Q085471</td>\n",
       "      <td>Q676160</td>\n",
       "      <td>[W04346, W17378, W19355, W17926, W14185, W1156...</td>\n",
       "      <td>[L2323, L1526, L2214, L1132, L2723, L1861, L22...</td>\n",
       "      <td>[W14586, W09745, W06017, W09067, W16319]</td>\n",
       "      <td>[L2568, L0971, L1291, L0358, L0037, L2582]</td>\n",
       "      <td>7</td>\n",
       "      <td>10</td>\n",
       "      <td>5</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>0</td>\n",
       "      <td>Q189314</td>\n",
       "      <td>Q438123</td>\n",
       "      <td>[W17508, W09996, W19662, W17534, W11399, W1705...</td>\n",
       "      <td>[L0018, L2321, L1346, L2432, L0902, L1149, L19...</td>\n",
       "      <td>[W18238, W02357, W06606]</td>\n",
       "      <td>[L3019, L0104, L1104, L1935, L1683, L2495, L2812]</td>\n",
       "      <td>8</td>\n",
       "      <td>14</td>\n",
       "      <td>3</td>\n",
       "      <td>7</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>Q267714</td>\n",
       "      <td>Q290126</td>\n",
       "      <td>[W13157, W03390, W01952, W05789, W17378, W0871...</td>\n",
       "      <td>[L2271, L1346, L1389, L2932, L0466, L2218, L19...</td>\n",
       "      <td>[W04476, W06606, W00316, W13157]</td>\n",
       "      <td>[L0050, L1187, L0104, L1683, L2495, L2812, L15...</td>\n",
       "      <td>7</td>\n",
       "      <td>12</td>\n",
       "      <td>4</td>\n",
       "      <td>10</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   label       q1       q2                                                 w1  \\\n",
       "0      1  Q397345  Q538594                   [W04465, W04058, W05284, W02916]   \n",
       "1      0  Q193805  Q699273           [W10054, W04476, W09996, W12244, W18103]   \n",
       "2      0  Q085471  Q676160  [W04346, W17378, W19355, W17926, W14185, W1156...   \n",
       "3      0  Q189314  Q438123  [W17508, W09996, W19662, W17534, W11399, W1705...   \n",
       "4      0  Q267714  Q290126  [W13157, W03390, W01952, W05789, W17378, W0871...   \n",
       "\n",
       "                                                  c1  \\\n",
       "0         [L2218, L2568, L0360, L0242, L2218, L0741]   \n",
       "1  [L2376, L2168, L0050, L1187, L0104, L2432, L09...   \n",
       "2  [L2323, L1526, L2214, L1132, L2723, L1861, L22...   \n",
       "3  [L0018, L2321, L1346, L2432, L0902, L1149, L19...   \n",
       "4  [L2271, L1346, L1389, L2932, L0466, L2218, L19...   \n",
       "\n",
       "                                         w2  \\\n",
       "0          [W18238, W18843, W01490, W09905]   \n",
       "1  [W18439, W00863, W04259, W00740, W16070]   \n",
       "2  [W14586, W09745, W06017, W09067, W16319]   \n",
       "3                  [W18238, W02357, W06606]   \n",
       "4          [W04476, W06606, W00316, W13157]   \n",
       "\n",
       "                                                  c2  wnum1  cnum1  wnum2  \\\n",
       "0  [L3019, L0104, L0582, L2218, L1861, L1556, L0242]      4      6      4   \n",
       "1  [L0156, L2452, L1187, L0104, L2459, L2979, L26...      5     10      5   \n",
       "2         [L2568, L0971, L1291, L0358, L0037, L2582]      7     10      5   \n",
       "3  [L3019, L0104, L1104, L1935, L1683, L2495, L2812]      8     14      3   \n",
       "4  [L0050, L1187, L0104, L1683, L2495, L2812, L15...      7     12      4   \n",
       "\n",
       "   cnum2  wboth  cboth  \n",
       "0      7      0      3  \n",
       "1      8      0      2  \n",
       "2      6      0      0  \n",
       "3      7      1      2  \n",
       "4     10      2      4  "
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_list = train_data.merge(questions, how=\"left\", left_on=\"q1\", right_on=\"qid\").drop(\"qid\", axis=1)\n",
    "train_list = train_list.rename(columns={\"words\": \"w1\", \"chars\": \"c1\"})\n",
    "train_list = train_list.merge(questions, how=\"left\", left_on=\"q2\", right_on=\"qid\").drop(\"qid\", axis=1)\n",
    "train_list = train_list.rename(columns={\"words\": \"w2\", \"chars\": \"c2\"})\n",
    "train_list[\"wnum1\"] = train_list[\"w1\"].map(len)\n",
    "train_list[\"cnum1\"] = train_list[\"c1\"].map(len)\n",
    "train_list[\"wnum2\"] = train_list[\"w2\"].map(len)\n",
    "train_list[\"cnum2\"] = train_list[\"c2\"].map(len)\n",
    "train_list[\"wboth\"] = train_list.apply(lambda x: len([t for t in x[\"w1\"] if t in x[\"w2\"]]), axis=1)\n",
    "train_list[\"cboth\"] = train_list.apply(lambda x: len([t for t in x[\"c1\"] if t in x[\"c2\"]]), axis=1)\n",
    "train_list.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>q1</th>\n",
       "      <th>q2</th>\n",
       "      <th>w1</th>\n",
       "      <th>c1</th>\n",
       "      <th>w2</th>\n",
       "      <th>c2</th>\n",
       "      <th>wnum1</th>\n",
       "      <th>cnum1</th>\n",
       "      <th>wnum2</th>\n",
       "      <th>cnum2</th>\n",
       "      <th>wboth</th>\n",
       "      <th>cboth</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Q017571</td>\n",
       "      <td>Q006012</td>\n",
       "      <td>[W17342, W06766, W04049, W16319, W07863]</td>\n",
       "      <td>[L0358, L0143, L0942, L1872, L1236, L3046, L00...</td>\n",
       "      <td>[W11668, W17378, W11399, W14113]</td>\n",
       "      <td>[L1791, L2214, L1872, L1236, L0947, L2323]</td>\n",
       "      <td>5</td>\n",
       "      <td>9</td>\n",
       "      <td>4</td>\n",
       "      <td>6</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Q728241</td>\n",
       "      <td>Q542572</td>\n",
       "      <td>[W17378, W17534, W02000, W19499, W05016, W0644...</td>\n",
       "      <td>[L2214, L1980, L1526, L2669, L0590, L2812, L05...</td>\n",
       "      <td>[W10157, W13631, W11299, W07863]</td>\n",
       "      <td>[L1796, L2568, L0127, L0004, L0030, L2120, L2927]</td>\n",
       "      <td>8</td>\n",
       "      <td>12</td>\n",
       "      <td>4</td>\n",
       "      <td>7</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Q166997</td>\n",
       "      <td>Q118270</td>\n",
       "      <td>[W17378, W19355, W03914, W18238, W03746]</td>\n",
       "      <td>[L2214, L1132, L2292, L0158, L3019, L0104, L01...</td>\n",
       "      <td>[W19468, W10157, W02288, W18951, W18448]</td>\n",
       "      <td>[L2253, L1796, L2568, L0156, L0762, L1486, L22...</td>\n",
       "      <td>5</td>\n",
       "      <td>8</td>\n",
       "      <td>5</td>\n",
       "      <td>8</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Q422420</td>\n",
       "      <td>Q514386</td>\n",
       "      <td>[W16938, W17867, W18843, W01490, W06036]</td>\n",
       "      <td>[L2172, L1074, L0582, L2218, L1861, L2705, L1037]</td>\n",
       "      <td>[W01490, W00496]</td>\n",
       "      <td>[L2218, L1861, L0377, L2619]</td>\n",
       "      <td>5</td>\n",
       "      <td>7</td>\n",
       "      <td>2</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Q354329</td>\n",
       "      <td>Q032485</td>\n",
       "      <td>[W17378, W19355, W01490, W11030, W19349, W1839...</td>\n",
       "      <td>[L2214, L1132, L2218, L1861, L1536, L0146, L06...</td>\n",
       "      <td>[W04745, W04622, W00863, W16521, W17765, W0650...</td>\n",
       "      <td>[L2572, L0135, L0562, L0445, L1187, L0104, L27...</td>\n",
       "      <td>7</td>\n",
       "      <td>11</td>\n",
       "      <td>7</td>\n",
       "      <td>13</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        q1       q2                                                 w1  \\\n",
       "0  Q017571  Q006012           [W17342, W06766, W04049, W16319, W07863]   \n",
       "1  Q728241  Q542572  [W17378, W17534, W02000, W19499, W05016, W0644...   \n",
       "2  Q166997  Q118270           [W17378, W19355, W03914, W18238, W03746]   \n",
       "3  Q422420  Q514386           [W16938, W17867, W18843, W01490, W06036]   \n",
       "4  Q354329  Q032485  [W17378, W19355, W01490, W11030, W19349, W1839...   \n",
       "\n",
       "                                                  c1  \\\n",
       "0  [L0358, L0143, L0942, L1872, L1236, L3046, L00...   \n",
       "1  [L2214, L1980, L1526, L2669, L0590, L2812, L05...   \n",
       "2  [L2214, L1132, L2292, L0158, L3019, L0104, L01...   \n",
       "3  [L2172, L1074, L0582, L2218, L1861, L2705, L1037]   \n",
       "4  [L2214, L1132, L2218, L1861, L1536, L0146, L06...   \n",
       "\n",
       "                                                  w2  \\\n",
       "0                   [W11668, W17378, W11399, W14113]   \n",
       "1                   [W10157, W13631, W11299, W07863]   \n",
       "2           [W19468, W10157, W02288, W18951, W18448]   \n",
       "3                                   [W01490, W00496]   \n",
       "4  [W04745, W04622, W00863, W16521, W17765, W0650...   \n",
       "\n",
       "                                                  c2  wnum1  cnum1  wnum2  \\\n",
       "0         [L1791, L2214, L1872, L1236, L0947, L2323]      5      9      4   \n",
       "1  [L1796, L2568, L0127, L0004, L0030, L2120, L2927]      8     12      4   \n",
       "2  [L2253, L1796, L2568, L0156, L0762, L1486, L22...      5      8      5   \n",
       "3                       [L2218, L1861, L0377, L2619]      5      7      2   \n",
       "4  [L2572, L0135, L0562, L0445, L1187, L0104, L27...      7     11      7   \n",
       "\n",
       "   cnum2  wboth  cboth  \n",
       "0      6      0      2  \n",
       "1      7      1      3  \n",
       "2      8      0      3  \n",
       "3      4      1      2  \n",
       "4     13      0      0  "
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_list = test_data.merge(questions, how=\"left\", left_on=\"q1\", right_on=\"qid\").drop(\"qid\", axis=1)\n",
    "test_list = test_list.rename(columns={\"words\": \"w1\", \"chars\": \"c1\"})\n",
    "test_list = test_list.merge(questions, how=\"left\", left_on=\"q2\", right_on=\"qid\").drop(\"qid\", axis=1)\n",
    "test_list = test_list.rename(columns={\"words\": \"w2\", \"chars\": \"c2\"})\n",
    "test_list[\"wnum1\"] = test_list[\"w1\"].map(len)\n",
    "test_list[\"cnum1\"] = test_list[\"c1\"].map(len)\n",
    "test_list[\"wnum2\"] = test_list[\"w2\"].map(len)\n",
    "test_list[\"cnum2\"] = test_list[\"c2\"].map(len)\n",
    "test_list[\"wboth\"] = test_list.apply(lambda x: len([t for t in x[\"w1\"] if t in x[\"w2\"]]), axis=1)\n",
    "test_list[\"cboth\"] = test_list.apply(lambda x: len([t for t in x[\"c1\"] if t in x[\"c2\"]]), axis=1)\n",
    "test_list.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 7.,  9., 11., 15.])"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "props = np.percentile(train_list[\"wnum1\"], [75, 90, 95, 99])\n",
    "props"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f912387c5c0>"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABJ8AAAFpCAYAAAAyfonSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3X+0XWV56Pvvk9/lhyIh3IskmIDhlNCEYDYhod1hQC4QTpXAPYCxitCBYs9thufggRqkRcsxo9VBS9XDEKHhp3qA0mtNNT0cJFChN0h2EMSAYKBUtmFoDD8ENITIc/9YM+liZ+3slez17p291vczxh6Z853vfNfzrkXYT571zjkjM5EkSZIkSZJKGDXcAUiSJEmSJKl9WXySJEmSJElSMRafJEmSJEmSVIzFJ0mSJEmSJBVj8UmSJEmSJEnFWHySJEmSJElSMRafJEmSJEmSVIzFJ0mSJEmSJBVj8UmSJEmSJEnFWHySJEmSJElSMWOGO4ChcNBBB+XUqVOHOwxJklTIunXrfpGZk4Y7Dr2VOZgkSe2t2RysI4pPU6dOpaenZ7jDkCRJhUTEvw13DNqZOZgkSe2t2RzMy+4kSZIkSZJUjMUnSZIkSZIkFWPxSZIkSZIkScV0xD2fJEkaKd544w16e3vZsmXLcIeyV5owYQKTJ09m7Nixwx2KJElqU+ZjOxtsDmbxSZKkvUhvby/7778/U6dOJSKGO5y9SmayefNment7mTZt2nCHI0mS2pT52Fu1IgfzsjtJkvYiW7ZsYeLEiSY6DUQEEydO9FtISZJUlPnYW7UiB7P4JEnSXsZEp3++N5IkaSiYc7zVYN8Pi0+SJGmv8N3vfpf3vOc9jBkzhjvvvHO4w5EkSeoIixYt4oADDuC9731vsdfwnk+SJO3Frr77qZaOd/EpR7Z0vFY67LDDuOmmm7jqqquGOxRJkqQd2j0fu/TSS/nVr37FV77ylWKv4conSZL0Fp///Of54he/CMDFF1/MySefDMA999zDhz70Ifbbbz8uv/xyjjnmGObNm8fPfvYzAC644IK3rFjab7/9ALjvvvs48cQTOffccznyyCNZtmwZX/va15g7dy4zZ87k6aefBmDq1KnMmjWLUaNMTyRJUme75ZZbmDVrFscccwznnXceF1xwAR//+Mc54YQTOPzww3fkXPfdd99bViwtXbqUm266CajlVp/61KeYP38+XV1dPPzww5x22mkcccQRXHvttTvOWbhwIfvvv3/R+ZjdSZKkt1iwYAH3338/AD09Pbz66qu88cYbPPDAA3R3d/Paa68xb948Hn30URYsWMD1118/4JiPPvooX/jCF3jssce49dZbeeqpp3jooYf4yEc+wpe+9KXSU5IkSRox1q9fz/Lly1m9evWOHArg+eef54EHHuBb3/oWy5Yta2qsKVOmsGbNGrq7u3d8Ufjggw9yxRVXlJzCTiw+SZKkt5gzZw7r1q3jlVdeYfz48cyfP5+enh7uv/9+uru7GTdu3I5v2ObMmcOzzz474JjHHXcchxxyCOPHj+eII47g1FNPBWDmzJlNnS9JktQpVq9ezdlnn81BBx0EwIEHHgjAmWeeyahRo5gxY8aOlecDOeOMM4BaznX88cez//77M2nSJCZMmMBLL71UZgINeM8nSZL0FmPHjmXq1KnceOONnHDCCcyaNYt7772Xp59+mqOOOoqxY8fueOLJ6NGj2bZtGwBjxozhzTffBCAz2bp1644xx48fv2N71KhRO/ZHjRq143xJkiTV8qhGT5erz6cyE3hr/gWwZcuWhufU51/b94cyB7P41Knu/YtyY590WbmxJUlDYsGCBVx11VXccMMNzJw5k0984hPMmTNnl4/ZnTp1KuvWrePcc8/lm9/8Jm+88cYQRiyNDK2+aW29ve0GtpKkPbNw4ULOOussLr74YiZOnMgLL7zQb993vetdPP7447z++uts2bKFe+65h9/7vd8bwmibY/GpQ615ZnOxseefVGxoSdIQ6e7uZvny5cyfP599992XCRMm0N3dvctzPvrRj7J48WLmzp3LwoUL2XfffXfrNdeuXctZZ53Fiy++yD/+4z/y6U9/mvXr1w9mGtJeZ95Pris4uk+KlKR2cPTRR3P55Zdz4oknMnr0aI499th++06ZMoVzzz2XWbNmMX369F327U93dzc/+tGPePXVV5k8eTIrVqzgtNNOG8wUdhLbl2q1s66uruzp6RnuMPYqa1ZcUmzs+Rea+EjSnnriiSc46qijhjuMvVqj9ygi1mVm1zCFpH6Yg+3MHEyS9n7mY40NJgfzhuOSJEmSJEkqxuKTJEmSJEmSirH4JEmSJEmSpGIsPkmSJEmSJKkYi0+SJEmSJEkqxuKTJElSh4iIRRHxZERsiIhlDY4viIiHI2JbRJxd1z47ItZExPqI+EFEvH9oI5ckSSOZxSdJkrRX+Ou//mtmzJjBrFmzWLhwIf/2b/823CG1lYgYDVwDnA7MAD4QETP6dPsJcAHw9T7tvwI+nJlHA4uAv4mIA8pGLEmSSnvkkUeYP38+Rx99NLNmzeL2228v8jpjiowqSZJa496/aO14J13W2vFa6Nhjj6Wnp4d99tmHL3/5y/zJn/xJsQSoQ80FNmTmMwARcRuwGHh8e4fMfLY69mb9iZn5VN32xoj4OTAJeKl82JIkDbM2zsf22WcfbrnlFqZPn87GjRuZM2cOp512Ggcc0NrvmIqufBrE0u6TIuKRup8tEXFmdeymiPjXumOzS85BkqRO8/nPf54vfvGLAFx88cWcfPLJANxzzz186EMfYr/99uPyyy/nmGOOYd68efzsZz8D4IILLuDOO+/cMc5+++0HwH333ceJJ57Iueeey5FHHsmyZcv42te+xty5c5k5cyZPP/00ACeddBL77LMPAPPmzaO3t3fI5twhDgWeq9vvrdp2S0TMBcYBT7coLkmS1Mctt9zCrFmzOOaYYzjvvPO44IIL+PjHP84JJ5zA4YcfviPnuu+++3jve9+747ylS5dy0003ATB16lQ+9alPMX/+fLq6unj44Yc57bTTOOKII7j22msBOPLII5k+fToA73znOzn44IPZtGlTy+dTrPg0mKXdmXlvZs7OzNnAydSWev/vui6Xbj+emY+UmoMkSZ1owYIF3H///QD09PTw6quv8sYbb/DAAw/Q3d3Na6+9xrx583j00UdZsGAB119//YBjPvroo3zhC1/gscce49Zbb+Wpp57ioYce4iMf+Qhf+tKXduq/YsUKTj/99JbPrcNFg7bcrQEiDgFuBf4wM9/sp89FEdETET0lkldJktrd+vXrWb58OatXr96RQwE8//zzPPDAA3zrW99i2bKd1vc0NGXKFNasWUN3d/eOLwoffPBBrrjiip36PvTQQ2zdupUjjjiipfOBsiufdiztzsytwPal3Ttk5rOZ+QOgYfJSORv4p8z8VblQJUnSdnPmzGHdunW88sorjB8/nvnz59PT08P9999Pd3c348aN2/EN25w5c3j22WcHHPO4447jkEMOYfz48RxxxBGceuqpAMycOXOn87/61a/S09PDpZde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\n",
      "text/plain": [
       "<Figure size 1440x432 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 6))\n",
    "train_list.plot(kind=\"hist\", y=[\"wnum1\", \"wnum2\"], bins=20, alpha=0.5, density=True, ax=ax1)\n",
    "train_list.plot(kind=\"hist\", y=[\"cnum1\", \"cnum2\"], bins=20, alpha=0.5, density=True, ax=ax2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x7f911a40a908>"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1440x432 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 6))\n",
    "test_list.plot(kind=\"hist\", y=[\"wnum1\", \"wnum2\"], bins=20, alpha=0.5, density=True, ax=ax1)\n",
    "test_list.plot(kind=\"hist\", y=[\"cnum1\", \"cnum2\"], bins=20, alpha=0.5, density=True, ax=ax2)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7f911b271588>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAABJEAAAFpCAYAAAAst7lhAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3X+QpVV5L/rvkxl+iBo0w5hShrlMkCTijzPqCKZMPEavCrk5YuqCAWOCXqvGnISq3IrmCLeuJHJiHT25CR7roAmJoNEYVHKNU8fJQY2apE7MyGAmKiBhQC60mDgB4WgMKvjcP3pD2qaHd89M7+7pvT+fqq5+93rXu/Za+52evfrb73p3dXcAAAAA4OF832p3AAAAAIDDnxAJAAAAgEFCJAAAAAAGCZEAAAAAGCREAgAAAGCQEAkAAACAQUIkAAAAAAYJkQAAAAAYJEQCAAAAYJAQCQAAAIBB61e7AwfiuOOO6xNPPHG1uwEATMi11177T929cbX7wfcyBwOA6TbuHGxNhUgnnnhidu/evdrdAAAmpKr+v9XuAw9lDgYA023cOZjlbAAAAAAMEiIBAAAAMEiIBAAAAMCgNXVPJACYdt/5zncyNzeXe++9d7W7MlFHH310Nm3alCOOOGK1uwIAzLhZmX8lhz4HEyIBwGFkbm4uj370o3PiiSemqla7OxPR3bnzzjszNzeXLVu2rHZ3AIAZNwvzr2R55mCWswHAYeTee+/Nhg0bpnoCU1XZsGHDTPy1DwA4/M3C/CtZnjmYEAkADjPTPoFJZmOMAMDaMStzk0MdpxAJAHjQ3Xffnbe//e0HfNxP/dRP5e67755AjwAApt9amYO5JxIAHMbet+u2ZW3v5adtftj9D0xgfumXful7yu+///6sW7duv8ft3LlzWfoHALDaVnr+laydOZgQCQB40AUXXJCbb745W7duzRFHHJFHPepRefzjH589e/bk+uuvz0tf+tLcfvvtuffee/Mrv/Ir2b59e5LkxBNPzO7du/ONb3wjZ5xxRn78x388f/3Xf53jjz8+H/7wh/OIRzxilUcGAHD4WitzMMvZAIAHvfnNb85JJ52UPXv25Ld+67fymc98Jm9605ty/fXXJ0kuv/zyXHvttdm9e3fe9ra35c4773xIGzfddFN++Zd/Odddd10e85jH5E/+5E9WehgAAGvKWpmDuRIJANivU0899Xs+AvZtb3tbPvShDyVJbr/99tx0003ZsGHD9xyzZcuWbN26NUnyzGc+M7feeuuK9RcAYBocrnMwIRIAsF+PfOQjH9z+1Kc+lY9//OP59Kc/nWOOOSbPe97zlvyI2KOOOurB7XXr1uVf/uVfVqSvAADT4nCdgwmR1rrdV0yu7W2vmlzbAByWHv3oR+frX//6kvvuueeePPaxj80xxxyTL37xi/mbv/mbFe4dHEbMwQBYRmtlDiZEAgAetGHDhjznOc/JU57ylDziEY/ID/7gDz647/TTT8/v/u7v5mlPe1p+5Ed+JM9+9rNXsacAANNjrczBqrtX7ckP1LZt23r37t2r3Y3Di7+CAUyVG264IU960pNWuxsrYqmxVtW13b1tlbrEfpiDLcEcDGBqzNL8Kzm0OZhPZwMAAABgkOVsAABwgHZ96a6JtX2aa/EAOEy5EgkAAACAQa5EWuP8FQwAAABYCa5EAgAAAGCQEAkAAACAQUIkAOBBd999d97+9rcf1LFvfetb881vfnOZewQAMP3WyhzMPZEA4HC2+4rlbW/bqx529wMTmF/6pV864Kbf+ta35hWveEWOOeaYg+0dAMDqW+H5V7J25mBCJADgQRdccEFuvvnmbN26NS984QvzuMc9Lh/4wAfyrW99Kz/zMz+TN77xjfnnf/7nvOxlL8vc3Fzuv//+vOENb8g//uM/5o477shP/uRP5rjjjssnP/nJ1R4KAMCasVbmYEIkAOBBb37zm/OFL3whe/bsyUc/+tFcddVV+cxnPpPuzkte8pL85V/+Zfbt25cnPOEJ+chHPpIkueeee3Lsscfmd37nd/LJT34yxx133CqPYvpV1elJ/kuSdUn+oLvfvGj/c5O8NcnTkpzT3VeNyrcmeUeS709yf5I3dff7V7LvAMBDrZU5mHsiAQBL+uhHP5qPfvSjefrTn55nPOMZ+eIXv5ibbropT33qU/Pxj388r3/96/NXf/VXOfbYY1e7qzOlqtYluTTJGUlOSXJuVZ2yqNptSV6Z5H2Lyr+Z5Be6+8lJTk/y1qp6zGR7DAAciMN5DuZKJABgSd2dCy+8MK95zWsesu/aa6/Nzp07c+GFF+ZFL3pRLrroolXo4cw6Ncne7r4lSarqyiRnJrn+gQrdfeto33cXHtjdf79g+46q+mqSjUnunny3AYBxHM5zMFciAQAPevSjH52vf/3rSZIXv/jFufzyy/ONb3wjSfLlL385X/3qV3PHHXfkmGOOySte8Yq87nWvy2c/+9mHHMtEHZ/k9gWP50ZlB6SqTk1yZJKbl6lfAMBBWitzsLGuRDqEdfc/meSSBVV/dLT/T6vqXUn+bZJ7Rvte2d17DmEsAMAh2rBhQ57znOfkKU95Ss4444y8/OUvz4/92I8lSR71qEflve99b/bu3Ztf+7Vfy/d93/fliCOOyDve8Y4kyfbt23PGGWfk8Y9/vBtrT1YtUdYH1EDV45O8J8l53f3d/dTZnmR7kmzevPlA+wgAHIC1Mger7oefc4zW3f99khdm/i9d1yQ5t7uvX1DnxMzfoPF1SXY8ECItaucHkuxNsqm7vzkKkf7bUnX3Z9u2bb179+5xq8+EXR/87Ym1fdrZr51Y2wAs7YYbbsiTnvSk1e7GilhqrFV1bXdvW6UurQlV9WNJfqO7Xzx6fGGSdPd/WqLuu7JovlVV35/kU0n+U3d/cJznNAd7KHMwgOkxS/Ov5NDmYOMsZ3tw3X13fzvJA+vuH9Tdt3b355Is+ZeskbOS/Fl3f3OM5wQAYGnXJDm5qrZU1ZFJzkmyY5wDR/U/lOQPxw2QAAAeME6ItCzr7jM/wfnjRWVvqqrPVdUlVXXUQbQJADBTuvu+JOcnuTrJDUk+0N3XVdXFVfWSJKmqZ1XVXJKzk/xeVV03OvxlSZ6b5JVVtWf0tXUVhgEArEHj3BNpudbdPzXzk50HXJjkHzJ/Q8fLkrw+ycVLHGs9PgDAAt29M8nORWUXLdi+JsmmJY57b5L3TryDAMBUGudKpLkkJyx4vCnJHQf4PC9L8qHu/s4DBd39lZ73rSRXZH7Z3EN092Xdva27t23cuPEAnxYA1p6h+xVOg1kYIwCwdszK3ORQxzlOiHTQ6+4XODeLlrKNrk5KVVWSlyb5wgG2CQBT5+ijj86dd9451ROZ7s6dd96Zo48+erW7AgAwE/OvZHnmYIPL2br7vqp6YN39uiSXP7DuPsnu7t5RVc/K/E0aH5vk31XVG7v7ycmDn9x2QpK/WNT0H1XVxswvl9uT5BcPehQAMCU2bdqUubm57Nu3b7W7MlFHH310Nm16yGorAIAVNyvzr+TQ52Dj3BPpoNfdj/bdmiVuxN3dzz+QjgLALDjiiCOyZcuW1e4GAMDMMP8a3zjL2QAAAACYcUIkAAAAAAYJkQAAAAAYJEQCAAAAYJAQCQAAAIBBQiQAAAAABgmRAAAAABgkRAIAAABgkBAJAAAAgEFCJAAAAAAGCZEAAAAAGCREAgAAAGCQEAkAAACAQUIkAAAAAAYJkQAAAAAYJEQCAAAAYJAQCQAAAIBBQiQAAAAABgmRAAAAABgkRAIAAABgkBAJAAAAgEFCJAAAAAAGCZEAAAAAGCREAgAAAGCQEAkAAACAQUIkAAAAAAYJkQAAAAAYJEQCAAAAYJAQCQAAAIBBQiQAAAAABgmRAAAAABgkRAIAAABg0FghUlWdXlU3VtXeqrpgif3PrarPVtV9VXXWon33V9We0deOBeVbqmpXVd1UVe+vqiMPfTgAAAAATMJgiFRV65JcmuSMJKckObeqTllU7bYkr0zyviWa+Jfu3jr6esmC8rckuaS7T07ytSSvPoj+AwAAALACxrkS6dQke7v7lu7+dpIrk5y5sEJ339rdn0vy3XGetKoqyfOTXDUqeneSl47dawAAAABW1Dgh0vFJbl/weG5UNq6jq2p3Vf1NVT0QFG1Icnd333eQbQIAAACwgsYJkWqJsj6A59jc3duSvDzJW6vqpANps6q2j0Ko3fv27TuApwUAmE6HeL/K80b3pLypqs5buV4DAGvdOCHSXJITFjzelOSOcZ+gu+8Yfb8lyaeSPD3JPyV5TFWtH2qzuy/r7m3dvW3jxo3jPi0AwFQ6lPtVVtUPJPn1JKdl/pYFv15Vj510nwGA6TBOiHRNkpNHn6Z2ZJJzkuwYOCZJUlWPraqjRtvHJXlOkuu7u5N8MskDfxk7L8mHD7TzAAAz6FDuV/niJB/r7ru6+2tJPpbk9JXoNACw9g2GSKP7Fp2f5OokNyT5QHdfV1UXV9VLkqSqnlVVc0nOTvJ7VXXd6PAnJdldVX+X+dDozd19/Wjf65P8alXtzfw9kt65nAMDAJhSh3K/ykO91yUAMMPWD1dJuntnkp2Lyi5asH1N5pekLT7ur5M8dT9t3pL5v6QBADC+Q7lf5QHdlzLJ9iTZvHnzmM0DANNsnOVsAAAcPg7lfpVjH+u+lADAYkIkAIC15aDvV5n52xO8aHTfyscmedGoDABgkBAJAGANOZT7VXb3XUn+Y+aDqGuSXDwqAwAYNNY9kQAAOHwc7P0qR/suT3L5RDsIAEwlVyIBAAAAMEiIBAAAAMAgIRIAAAAAg4RIAAAAAAwSIgEAAAAwSIgEAAAAwCAhEgAAAACDhEgAAAAADBIiAQAAADBIiAQAAADAICESAAAAAIOESAAAAAAMEiIBAAAAMGj9andgFrxv120Ta/ukibUMAAAA8K9ciQQAAADAICESAAAAAIOESAAAAAAMEiIBAAAAMEiIBAAAAMAgIRIAAAAAg4RIAAAAAAwSIgEAAAAwaP1qd2AWnHTbB1e7CwAAAACHxJVIAAAAAAwSIgEAAAAwSIgEAAAAwCAhEgAAAACDhEgAAAAADBIiAQAAADBorBCpqk6vqhuram9VXbDE/udW1Wer6r6qOmtB+daq+nRVXVdVn6uqn12w711V9aWq2jP62ro8QwIAAABgua0fqlBV65JcmuSFSeaSXFNVO7r7+gXVbkvyyiSvW3T4N5P8QnffVFVPSHJtVV3d3XeP9v9ad191qIMAAAAAYLIGQ6QkpybZ2923JElVXZnkzCQPhkjdfeto33cXHtjdf79g+46q+mqSjUnuDgAAAABrxjjL2Y5PcvuCx3OjsgNSVacmOTLJzQuK3zRa5nZJVR11oG0CAAAAsDLGuRKplijrA3mSqnp8kvckOa+7H7ha6cIk/5D5YOmyJK9PcvESx25Psj1JNm/efCBPCwAAa8/uKybX9rZXTa5tAKbeOFcizSU5YcHjTUnuGPcJqur7k3wkyf/d3X/zQHl3f6XnfSvJFZlfNvcQ3X1Zd2/r7m0bN24c92kBAAAAWEbjhEjXJDm5qrZU1ZFJzkmyY5zGR/U/lOQPu/uDi/Y9fvS9krw0yRcOpOMAAAAArJzBEKm770tyfpKrk9yQ5APdfV1VXVxVL0mSqnpWVc0lOTvJ71XVdaPDX5bkuUleWVV7Rl9bR/v+qKo+n+TzSY5L8pvLOjIAAAAAls0490RKd+9MsnNR2UULtq/J/DK3xce9N8l799Pm8w+opwAAMAN2femuibV92raJNQ3ADBhnORsAAAAAM06IBAAAAMAgIRIAAAAAg4RIAABrTFWdXlU3VtXeqrpgif1HVdX7R/t3VdWJo/IjqurdVfX5qrqhqi5c6b4DAGuXEAkAYA2pqnVJLk1yRpJTkpxbVacsqvbqJF/r7icmuSTJW0blZyc5qrufmuSZSV7zQMAEADBEiAQAsLacmmRvd9/S3d9OcmWSMxfVOTPJu0fbVyV5QVVVkk7yyKpan+QRSb6d5H+uTLcBgLVOiAQAsLYcn+T2BY/nRmVL1unu+5Lck2RD5gOlf07ylSS3Jfl/unvJz5Ovqu1Vtbuqdu/bt295RwAArElCJACAtaWWKOsx65ya5P4kT0iyJclrq+qHlnqS7r6su7d197aNGzceSn8BgCkhRAIAWFvmkpyw4PGmJHfsr85o6dqxSe5K8vIk/727v9PdX03yP5Jsm3iPAYCpIEQCAFhbrklyclVtqaojk5yTZMeiOjuSnDfaPivJJ7q7M7+E7fk175FJnp3kiyvUbwBgjRMiAQCsIaN7HJ2f5OokNyT5QHdfV1UXV9VLRtXemWRDVe1N8qtJLhiVX5rkUUm+kPkw6oru/tyKDgAAWLPWr3YHAAA4MN29M8nORWUXLdi+N8nZSxz3jaXKAQDGIURi/3ZfMbm2t71qcm0DAAAAy85yNgAAAAAGuRIJAICp9L5dt02s7ZMm1jIAHL5ciQQAAADAIFcisV+7vnTXxNo+bdvEmgYASJKcdNsHV7sLADBVXIkEAAAAwCAhEgAAAACDhEgAAAAADBIiAQAAADBIiAQAAADAICESAAAAAIOESAAAAAAMEiIBAAAAMEiIBAAAAMAgIRIAAAAAg4RIAAAAAAwSIgEAAAAwSIgEAAAAwCAhEgAAAACDhEgAAAAADBIiAQAAADBorBCpqk6vqhuram9VXbDE/udW1Wer6r6qOmvRvvOq6qbR13kLyp9ZVZ8ftfm2qqpDHw4AAAAAkzAYIlXVuiSXJjkjySlJzq2qUxZVuy3JK5O8b9GxP5Dk15OcluTUJL9eVY8d7X5Hku1JTh59nX7QowAAAABgosa5EunUJHu7+5bu/naSK5OcubBCd9/a3Z9L8t1Fx744yce6+67u/lqSjyU5vaoen+T7u/vT3d1J/jDJSw91MAAAAABMxjgh0vFJbl/weG5UNo79HXv8aHuwzaraXlW7q2r3vn37xnxaAAAAAJbTOCHSUvcq6jHb39+xY7fZ3Zd197bu3rZx48YxnxYAAACA5TROiDSX5IQFjzcluWPM9vd37Nxo+2DaBAAAAGCFjRMiXZPk5KraUlVHJjknyY4x2786yYuq6rGjG2q/KMnV3f2VJF+vqmePPpXtF5J8+CD6DwAAAMAKGAyRuvu+JOdnPhC6IckHuvu6qrq4ql6SJFX1rKqaS3J2kt+rqutGx96V5D9mPoi6JsnFo7Ik+fdJ/iDJ3iQ3J/mzZR0ZAAAAAMtm/TiVuntnkp2Lyi5asH1Nvnd52sJ6lye5fIny3UmeciCdBQAAAGB1jLOcDQAAAIAZJ0QCAAAAYJAQCQAAAIBBQiQAAAAABgmRAAAAABgkRAIAAABgkBAJAAAAgEFCJAAAAAAGCZEAAAAAGCREAgAAAGCQEAkAYI2pqtOr6saq2ltVFyyx/6iqev9o/66qOnHBvqdV1aer6rqq+nxVHb2SfQcA1i4hEgDAGlJV65JcmuSMJKckObeqTllU7dVJvtbdT0xySZK3jI5dn+S9SX6xu5+c5HlJvrNCXQcA1jghEgDA2nJqkr3dfUt3fzvJlUnOXFTnzCTvHm1fleQFVVVJXpTkc939d0nS3Xd29/0r1G8AYI0TIgEArC3HJ7l9weO5UdmSdbr7viT3JNmQ5IeTdFVdXVWfrar/sAL9BQCmxPrV7gAAAAeklijrMeusT/LjSZ6V5JtJ/ryqru3uP3/Ik1RtT7I9STZv3nxIHQYApoMrkQAA1pa5JCcseLwpyR37qzO6D9KxSe4alf9Fd/9Td38zyc4kz1jqSbr7su7e1t3bNm7cuMxDAADWIiESAMDack2Sk6tqS1UdmeScJDsW1dmR5LzR9llJPtHdneTqJE+rqmNG4dK/TXL9CvUbAFjjLGcDAFhDuvu+qjo/84HQuiSXd/d1VXVxkt3dvSPJO5O8p6r2Zv4KpHNGx36tqn4n80FUJ9nZ3R9ZlYEAAGuOEAkAYI3p7p2ZX4q2sOyiBdv3Jjl7P8e+N8l7J9pBAGAqWc4GAAAAwCAhEgAAAACDhEgAAAAADBIiAQAAADBIiAQAAADAICESAAAAAIOESAAAAAAMEiIBAAAAMEiIBAAAAMAgIRIAAAAAg4RIAAAAAAwSIgEAAAAwSIgEAAAAwKCxQqSqOr2qbqyqvVV1wRL7j6qq94/276qqE0flP1dVexZ8fbeqto72fWrU5gP7HrecAwMAAABg+QyGSFW1LsmlSc5IckqSc6vqlEXVXp3ka939xCSXJHlLknT3H3X31u7emuTnk9za3XsWHPdzD+zv7q8uw3gAAAAAmIBxrkQ6Ncne7r6lu7+d5MokZy6qc2aSd4+2r0rygqqqRXXOTfLHh9JZAAAAAFbHOCHS8UluX/B4blS2ZJ3uvi/JPUk2LKrzs3loiHTFaCnbG5YInQAAAAA4TIwTIi0V7vSB1Kmq05J8s7u/sGD/z3X3U5P8xOjr55d88qrtVbW7qnbv27dvjO4CAAAAsNzGCZHmkpyw4PGmJHfsr05VrU9ybJK7Fuw/J4uuQuruL4++fz3J+zK/bO4huvuy7t7W3ds2btw4RncBAAAAWG7jhEjXJDm5qrZU1ZGZD4R2LKqzI8l5o+2zknyiuztJqur7kpyd+XspZVS2vqqOG20fkeSnk3whAAAAAByW1g9V6O77qur8JFcnWZfk8u6+rqouTrK7u3ckeWeS91TV3sxfgXTOgiaem2Suu29ZUHZUkqtHAdK6JB9P8vvLMiIAAAAAlt1giJQk3b0zyc5FZRct2L4381cbLXXsp5I8e1HZPyd55gH2FQAAAIBVMs5yNgAAAABmnBAJAAAAgEFCJAAAAAAGCZEAAAAAGCREAgAAAGCQEAkAAACAQUIkAAAAAAYJkQAAAAAYJEQCAAAAYJAQCQAAAIBBQiQAAAAABgmRAAAAABgkRAIAAABgkBAJAAAAgEFCJAAAAAAGCZEAAAAAGCREAgAAAGCQEAkAAACAQUIkAIA1pqpOr6obq2pvVV2wxP6jqur9o/27qurERfs3V9U3qup1K9VnAGDtEyIBAKwhVbUuyaVJzkhySpJzq+qURdVeneRr3f3EJJckecui/Zck+bNJ9xUAmC5CJACAteXUJHu7+5bu/naSK5OcuajOmUnePdq+KskLqqqSpKpemuSWJNetUH8BgCkhRAIAWFuOT3L7gsdzo7Il63T3fUnuSbKhqh6Z5PVJ3rgC/QQApowQCQBgbaklynrMOm9Mckl3f2PwSaq2V9Xuqtq9b9++g+gmADBt1q92BwAAOCBzSU5Y8HhTkjv2U2euqtYnOTbJXUlOS3JWVf3nJI9J8t2qure7/+viJ+nuy5JcliTbtm1bHFIBADNIiAQAsLZck+TkqtqS5MtJzkny8kV1diQ5L8mnk5yV5BPd3Ul+4oEKVfUbSb6xVIAEALAUIRIAwBrS3fdV1flJrk6yLsnl3X1dVV2cZHd370jyziTvqaq9mb8C6ZzV6zEAMC2ESAAAa0x370yyc1HZRQu2701y9kAbvzGRzgEAU8uNtQEAAAAYJEQCAAAAYJAQCQAAAIBBQiQAAAAABgmRAAAAABgkRAIAAABg0FghUlWdXlU3VtXeqrpgif1HVdX7R/t3VdWJo/ITq+pfqmrP6Ot3FxzzzKr6/OiYt1VVLdegAAAAAFhegyFSVa1LcmmSM5KckuTcqjplUbVXJ/ladz8xySVJ3rJg383dvXX09YsLyt+RZHuSk0dfpx/8MAAAAACYpHGuRDo1yd7uvqW7v53kyiRnLqpzZpJ3j7avSvKCh7uyqKoen+T7u/vT3d1J/jDJSw+49wAAAACsiHFCpOOT3L7g8dyobMk63X1fknuSbBjt21JVf1tVf1FVP7Gg/txAmwAAAAAcJtaPUWepK4p6zDpfSbK5u++sqmcm+dOqevKYbc43XLU988vesnnz5jG6CwAAAMByGydEmktywoLHm5LcsZ86c1W1PsmxSe4aLVX7VpJ097VVdXOSHx7V3zTQZkbHXZbksiTZtm3bkkETa9DuKybX9rZXTa5tAAAAmFHjLGe7JsnJVbWlqo5Mck6SHYvq7Ehy3mj7rCSf6O6uqo2jG3Onqn4o8zfQvqW7v5Lk61X17NG9k34hyYeXYTwAAAAATMDglUjdfV9VnZ/k6iTrklze3ddV1cVJdnf3jiTvTPKeqtqb5K7MB01J8twkF1fVfUnuT/KL3X3XaN+/T/KuJI9I8mejLwAAAAAOQ+MsZ0t370yyc1HZRQu2701y9hLH/UmSP9lPm7uTPOVAOsv02PWlu4YrHaTTtk2saQAAAJhZ4yxnAwAAAGDGCZEAAAAAGCREAgAAAGCQEAkAAACAQUIkAAAAAAYJkQAAAAAYJEQCAAAAYJAQCQAAAIBBQiQAAAAABq1f7Q4AAAArZPcVk2t726sm1zYAhwVXIgEAAAAwyJVIAAAwI3Z96a6JtX3atok1DcBhwpVIAAAAAAwSIgEAAAAwSIgEAAAAwCAhEgAAAACDhEgAAAAADBIiAQAAADBIiAQAAADAICESAAAAAIOESAAAAAAMEiIBAAAAMEiIBAAAAMAgIRIAAAAAg4RIAAAAAAwSIgEArDFVdXpV3VhVe6vqgiX2H1VV7x/t31VVJ47KX1hV11bV50ffn7/SfQcA1i4hEgDAGlJV65JcmuSMJKckObeqTllU7dVJvtbdT0xySZK3jMr/Kcm/6+6nJjkvyXtWptcAwDQQIgEArC2nJtnb3bd097eTXJnkzEV1zkzy7tH2VUleUFXV3X/b3XeMyq9LcnRVHbUivQYA1jwhEgDA2nJ8ktsXPJ4blS1Zp7vvS3JPkg2L6vzvSf62u781oX4CAFNm/Wp3AACAA1JLlPWB1KmqJ2d+iduL9vskVduTbE+SzZs3H3gvmTnv23XbxNp++Wn+DQIcDoRIAABry1ySExY83pTkjv3Umauq9UmOTXJXklTVpiQfSvIL3X3z/p6kuy9LclmSbNu2bXFIBQ9x0m0fnFzjp712cm0DMDbL2QAA1pZrkpxcVVuq6sgk5yTZsajOjszfODtJzkryie7uqnpMko8kubC7/8eK9RgAmApfdOICAAALwklEQVRjhUiT+BjZqvrUqM09o6/HLdegAACm1egeR+cnuTrJDUk+0N3XVdXFVfWSUbV3JtlQVXuT/GqSB+Zv5yd5YpI3mIMBAAdqcDnbgo+RfWHmL42+pqp2dPf1C6o9+DGyVXVO5tfY/2z+9WNk76iqp2R+srPwxo8/1927l2ksAAAzobt3Jtm5qOyiBdv3Jjl7ieN+M8lvTryDAMBUGudKJB8jCwAAADDjxgmRJvkxsleMLqN+Q1Ut9SkiAAAAABwGxgmRlvNjZF+zYP/PdfdTk/zE6Ovnl3zyqu1Vtbuqdu/bt2+M7gIAAACw3MYJkQ7kY2Qz7sfIdveXR9+/nuR9mV829xDdfVl3b+vubRs3bhxnTAAAAAAss3FCpGX/GNmqWl9Vx422j0jy00m+cGhDAQAAAGBSBkOkCX2M7FFJrq6qzyXZk+TLSX5/OQcGAAAAwPJZP06lCX2M7DPH7yYAAAAAq2mc5WwAAAAAzDghEgAAAACDhEgAAAAADBIiAQAAADBIiAQAAADAoLE+nQ3Wkl0f/O2JtX3a2a+dWNsAAABwOHMlEgAAAACDXIkEAMCqed+u2ybW9kkTaxkAZpMrkQAAAAAYJEQCAAAAYJAQCQAAAIBBQiQAAAAABrmx9oibOgIAAADsnxAJAIBVc9JtH1ztLgAAY7KcDQAAAIBBQiQAAAAABgmRAAAAABjknkgj1uMDAMDhaZIfgvPy0zZPrG2AaeNKJAAAAAAGuRIJAAA4rE101cBpr51c2wBTxpVIAAAAAAwSIgEAAAAwSIgEAAAAwCAhEgAAAACDhEgAAAAADPLpbHAAdn3wtyfW9mln+2QQAAAADl+uRAIAAABgkBAJAAAAgEFCJAAAAAAGuScSAAAws96367aJtf3y0zZPrG2A1SBEAgAAZtZJt31wco2f5oNTgOliORsAAAAAg1yJBIeJXR/87Ym1fdrZ/goGAADAoRnrSqSqOr2qbqyqvVV1wRL7j6qq94/276qqExfsu3BUfmNVvXjcNgEAWNok5mYAAEMGr0SqqnVJLk3ywiRzSa6pqh3dff2Caq9O8rXufmJVnZPkLUl+tqpOSXJOkicneUKSj1fVD4+OGWoTWCZuGAkwPSYxN+vu+1d2FDAbXGkOTJtxlrOdmmRvd9+SJFV1ZZIzkyycqJyZ5DdG21cl+a9VVaPyK7v7W0m+VFV7R+1ljDaBZeKGkQBTZRJzs0+vUN8BgDVsnBDp+CS3L3g8l+S0/dXp7vuq6p4kG0blf7Po2ONH20NtAmvAJP/CNmmnbfmByTW+7VWTaxuYdZOamwFryFqdg5l/wdo2TohUS5T1mHX2V77UvZgWtznfcNX2JNtHD79RVTfup5+LHZfkn8asOw1mbbyJMc+CNTze/+NgD1zDYz5oszbmWRtvcmBj/l8m2ZEpMYm52UOfZLw52Cz+e54Er+Py8VoujzX6Oh70/GuS1uhredjxOi6Ph3sdx5qDjRMizSU5YcHjTUnu2E+duapan+TYJHcNHDvUZpKkuy9LctkY/fweVbW7u7cd6HFr1ayNNzHmWTBr402MeRbM2niT2RzzhE1qbvY9xpmDObfLw+u4fLyWy8PruHy8lsvD67g8luN1HOfT2a5JcnJVbamqIzN/M8Ydi+rsSHLeaPusJJ/o7h6VnzP6hJAtSU5O8pkx2wQA4KEmMTcDABg0eCXSaB39+UmuTrIuyeXdfV1VXZxkd3fvSPLOJO8Z3ZzxrsxPZjKq94HM3+jxviS//MCnfyzV5vIPDwBgukxqbgYAMGSc5Wzp7p1Jdi4qu2jB9r1Jzt7PsW9K8qZx2lxmB7wEbo2btfEmxjwLZm28iTHPglkbbzKbY56oSczNDpJzuzy8jsvHa7k8vI7Lx2u5PLyOy+OQX8eav7IZAAAAAPZvnHsiAQAAADDjpi5EqqrTq+rGqtpbVResdn9WQlXdWlWfr6o9VbV7tfszCVV1eVV9taq+sKDsB6rqY1V10+j7Y1ezj8ttP2P+jar68uhc76mqn1rNPi6nqjqhqj5ZVTdU1XVV9Suj8qk9zw8z5qk8z1V1dFV9pqr+bjTeN47Kt1TVrtE5fv/oRsFT4WHG/K6q+tKCc7x1tfu6nKpqXVX9bVX9t9HjqT3Hs2wW51zLYRbnNJMwi/OGSZnF9+dJ8h546Jb6/dbP9sGpqsdU1VVV9cXR/5c/dqiv5VSFSFW1LsmlSc5IckqSc6vqlNXt1Yr5ye7eOsUfe/iuJKcvKrsgyZ9398lJ/nz0eJq8Kw8dc5JcMjrXW0f3xJgW9yV5bXc/Kcmzk/zy6Od3ms/z/sacTOd5/laS53f3v0myNcnpVfXsJG/J/HhPTvK1JK9exT4ut/2NOUl+bcE53rN6XZyIX0lyw4LH03yOZ9KMz7kO1bsye3OaSZjFecOkzOL78yR5D1wei3+/9bN9cP5Lkv/e3T+a5N9k/t/mIb2WUxUiJTk1yd7uvqW7v53kyiRnrnKfWAbd/ZeZ/3SZhc5M8u7R9ruTvHRFOzVh+xnz1Orur3T3Z0fbX8/8f3DHZ4rP88OMeSr1vG+MHh4x+uokz09y1ah82s7x/sY8tapqU5L/LckfjB5XpvgczzBzroM0i3OaSZjFecOkzOL786R4D5woP9sHqKq+P8lzM/+Jrenub3f33TnE13LaQqTjk9y+4PFcpvgXsgU6yUer6tqq2r7anVlBP9jdX0nmJxJJHrfK/Vkp51fV50aXw0/lZZxVdWKSpyfZlRk5z4vGnEzpeR5d4r0nyVeTfCzJzUnu7u77RlWm7v/txWPu7gfO8ZtG5/iSqjpqFbu43N6a5D8k+e7o8YZM+TmeUbM655qUmXivm5RZnDcst1l8f54Q74HLY6nfb/1sH7gfSrIvyRWjJZZ/UFWPzCG+ltMWItUSZVP9F9+R53T3MzJ/SfkvV9VzV7tDTMw7kpyU+UuNv5Lkt1e3O8uvqh6V5E+S/J/d/T9Xuz8rYYkxT+157u77u3trkk2Zv5LhSUtVW9leTdbiMVfVU5JcmORHkzwryQ8kef0qdnHZVNVPJ/lqd1+7sHiJqlN1jmeU88phYRbnDZMwi+/Py8174LLy++3yWJ/kGUne0d1PT/LPWYZlgNMWIs0lOWHB401J7lilvqyY7r5j9P2rST6U+f/4Z8E/VtXjk2T0/aur3J+J6+5/HL3JfzfJ72fKznVVHZH5ieAfdff/Oyqe6vO81Jin/TwnyehS2k9l/j4Wj6mq9aNdU/v/9oIxnz5ahtHd/a0kV2R6zvFzkrykqm7N/PKm52f+r7IzcY5nzEzOuSZoqt/rJmUW5w2TNovvz8vIe+Ay2c/vt362D9xckrkFV8FflflQ6ZBey2kLka5JcvLoDvhHJjknyY5V7tNEVdUjq+rRD2wneVGSLzz8UVNjR5LzRtvnJfnwKvZlRTzwwz7yM5micz1aM/7OJDd09+8s2DW153l/Y57W81xVG6vqMaPtRyT5XzN/D4tPJjlrVG3azvFSY/7igjfuyvw69Kk4x919YXdv6u4TM/8e/Inu/rlM8TmeYTM355qwqX2vm5RZnDdMyiy+P0+C98Dl8TC/3/rZPkDd/Q9Jbq+qHxkVvSDJ9TnE17K6p+tqupr/KOy3JlmX5PLuftMqd2miquqHMp/OJvOXq71vGsdcVX+c5HlJjkvyj0l+PcmfJvlAks1JbktydndPzY2o9zPm52V+iVMnuTXJax5Yz7rWVdWPJ/mrJJ/Pv64j/78yf3+DqTzPDzPmczOF57mqnpb5m/ety/wfMT7Q3ReP/h+7MvPLuv42yStGV+iseQ8z5k8k2Zj5y9z3JPnFBTc1nQpV9bwkr+vun57mczzLZm3OtVxmcU4zCbM4b5iUWXx/njTvgQdvf7/fVtWG+Nk+YFW1NfM3ej8yyS1JXpXRz3kO8rWcuhAJAAAAgOU3bcvZAAAAAJgAIRIAAAAAg4RIAAAAAAwSIgEAAAAwSIgEAAAAwCAhEgAAAACDhEgAAAAADBIiAQAAADDo/wdTFWD/VnC4EQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 1440x432 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(20, 6))\n",
    "ax1.hist(train_list[\"wnum1\"], bins=20, label=\"train\", alpha=0.4, density=True)\n",
    "ax1.hist(test_list[\"wnum1\"], bins=20, label=\"test\", alpha=0.4, density=True)\n",
    "ax1.legend()\n",
    "ax2.hist(train_list[\"cnum1\"], bins=20, label=\"train\", alpha=0.4, density=True)\n",
    "ax2.hist(test_list[\"cnum1\"], bins=20, label=\"test\", alpha=0.4, density=True)\n",
    "ax2.legend()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**We can see** that the distributions of train and test are highly in accordance."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
